<?php
class Excel
{
	private $header = "<?xml version=\"1.0\" encoding=\"%s\"?\>\n<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:html=\"http://www.w3.org/TR/REC-html40\">";
	private $footer = "</Workbook>";
	private $lines = array();
	private $sEncoding;
	private $bConvertTypes;
	private $sWorksheetTitle;
	public function __construct($sEncoding = 'UTF-8', $bConvertTypes = true, $sWorksheetTitle = 'Table1')
	{
		$this->bConvertTypes = $bConvertTypes;
		$this->setEncoding($sEncoding);
		$this->setWorksheetTitle($sWorksheetTitle);
	}

	public function setEncoding($sEncoding)
	{
		$this->sEncoding = $sEncoding;
	}
	
	public function setWorksheetTitle ($title)
	{
		$title = preg_replace ("/[\\\|:|\/|\?|\*|\[|\]]/", "", $title);
		$title = substr ($title, 0, 31);
		$this->sWorksheetTitle = $title;
	}
	
	public function addRow ($array)
	{
		$cells = "";
		foreach ($array as $k => $v){
			$type = 'String';
			if ($this->bConvertTypes === true && is_numeric($v)){
				$type = 'Number';
			}
			$v = htmlentities($v, ENT_COMPAT, $this->sEncoding);
			$cells .= "<Cell><Data ss:Type=\"$type\">" . $v . "</Data></Cell>\n";
		}
		$this->lines[] = "<Row>\n" . $cells . "</Row>\n";
	}


	public function addArray ($array)
	{
		foreach ($array as $k => $v){
			$this->addRow ($v);
		}
	}

	public function generateXML ($data=array(), $filename = '')
	{
		$this->addArray($data);
		$xsl = '';
		$filename = preg_replace('/[^aA-zZ0-9\_\-]/', '', $filename);
		if ($filename){
			header("Content-Type: application/vnd.ms-excel; charset=" . $this->sEncoding);
			header("Content-Disposition: inline; filename=\"" . $filename . ".xls\"");
		}
		$xsl = stripslashes (sprintf($this->header, $this->sEncoding));
		$xsl .= "\n<Worksheet ss:Name=\"" . $this->sWorksheetTitle . "\">\n<Table>\n";
		foreach ($this->lines as $line){
			$xsl .= $line;
		}
		$xsl .= "</Table>\n</Worksheet>\n";
		$xsl .= $this->footer;
		if ($filename) {
			echo $xsl;
		}else{
			return $xsl;
		}
	}

}